package com.kevin.mapping.script.node.stmt;

import com.kevin.mapping.script.engine.JSONEnv;
import com.kevin.mapping.script.lexer.*;
import com.kevin.mapping.script.node.Node;

import java.math.BigDecimal;


public class Stmt extends Node {
    public Stmt(Token token) {
        setToken(token);
    }

    @Override
    public String toString() {
        return getToken().toString();
    }

    @Override
    public Token execute(JSONEnv env) {
        if (getToken().type != Type.PATH) {
            return getToken();
        }
        Object value = getToken().getValue(env);
        if (value instanceof BigDecimal) {
            return new BigDecimalValue(Type.BIG_DECIMAL, (BigDecimal) value);
        } else if (value instanceof Boolean) {
            return new BoolValue(Type.BOOLEAN, (Boolean) value);
        } else if (value instanceof Integer) {
            return new IntegerValue(Type.INTEGER, (Integer) value);
        } else if (value instanceof Long) {
            return new LongValue(Type.LONG, (Long) value);
        } else if (value instanceof Double) {
            return new DoubleValue(Type.DOUBLE, (Double) value);
        } else if (value instanceof String) {
            return new StrValue(Type.STR_VALUE, (String) value);
        } else {
            return new ObjectValue(Type.OBJECT, value);
        }
    }

    @Override
    public Object getValue(JSONEnv env) {
        return getToken().getValue(env);
    }
}
